﻿/***************************************************************
 * Name:      url_parser.h
 * Purpose:   URL解析器类定义
 * Author:    杨卓荦 (yzl@bang5.net)
 * Created:   2010-08-29
 * Copyright: 杨卓荦 (http://www.bang5.net)
 * License:
 **************************************************************/

#ifndef CLOUDOWN_URL_PARSER_H_
#define CLOUDOWN_URL_PARSER_H_

#include "common.h"

class UrlParser {
public:
  UrlParser();
  std::string GetUser();
  std::string GetPass();
  // 获得服务器名
  std::string GetServer();
  // 获得端口号
  int GetPort();
  // 获得服务器上的文件路径名
  std::string GetFilePathName();
  // 获得经过转义的服务器上的文件路径名
  std::string GetEscFilePathName();
  // 获得文件名
  std::string GetFileName();
  std::string GetRawUrl();
  bool IsValidMirror();
  _PROTYPE GetUrlType();
  bool SetUrl( std::string fullurl );
  bool RebuildUrl( std::string& fullurl, std::string user, std::string pass, std::string& rebuild );
  std::string GetRefer();  // 获得默认的Referer
  void SetRefer( std::string& ref );  // 设置一个用户自定义的Referer
private:
  _PROTYPE UrlType( std::string fullurl );
  bool GetUserAndPass( const std::string& fullurl, std::string& user, std::string& pass );
  bool GetServerAndPort( const std::string& fullurl, std::string& server, int& port );
  int GetDefaultPort( _PROTYPE protocol );
  bool GetRawUrl( std::string& fullurl, std::string& rawurl );
  bool GetPathFile( std::string& fullurl, std::string& pathfile );
  bool GetRefer( std::string rawurl, std::string& refer );
  void Precode( const std::string& pathfile, std::string& escfile );
  void UnEscape( char *s );
  void UnEscape( std::string& str );
  std::string m_user;
  std::string m_pass;
  std::string m_file;
  std::string m_server;
  std::string m_escfile;
  std::string m_refer; // 只有HTTP协议可用
  std::string m_raw;   // 不含用户名和密码的URL
  int m_port;
  bool m_bValidMirrorUrl;
  _PROTYPE m_protocol;
};
#endif  // CLOUDOWN_URL_PARSER_H_

